home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Info-Mac 3
/
Info_Mac_1994-01.iso
/
Development
/
General
/
GCC 1.37.1r15
/
Machines
/
mips.md
< prev
next >
Wrap
Text File
|
1990-03-14
|
83KB
|
3,107 lines
;; Mips.md Naive version of Machine Description for MIPS
;; Contributed by A. Lichnewsky, lich@inria.inria.fr
;; Copyright (C) 1989 Free Software Foundation, Inc.
;; This file is part of GNU CC.
;; GNU CC is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 1, or (at your option)
;; any later version.
;; GNU CC is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU CC; see the file COPYING. If not, write to
;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
;;
;;------------------------------------------------------------------------
;;
;;
;; ....................
;;
;; Peephole Optimizations for
;;
;; ARITHMETIC
;;
;; ....................
;;
;;- The following peepholes are
;;- motivated by the fact that
;;- stack movement result in some
;;- cases in embarrassing sequences
;;- of addiu SP,SP,int
;;- addiu SP,SP,other_int
;;- --------------------
;;- REMARK: this would be done better
;;- by analysis of dependencies in
;;- basic blocks, prior to REG ALLOC,
;;- and simplification of trees:
;;- (+ (+ REG const) const)
;;- -> (+ REG newconst)
;;- --------------------
(define_peephole
[(set (match_operand:SI 0 "general_operand" "=r")
(plus:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "general_operand" "IJ")))
(set (match_operand:SI 3 "general_operand" "=r")
(plus:SI (match_dup 0)
(match_operand:SI 4 "general_operand" "IJ")))]
" /* DATA FLOW SEMANTICS*/
(((REGNO (operands[0])) == (REGNO (operands[3])))
||
dead_or_set_p (insn, operands[0]))
&&
( /* CONSTRAINTS */
(GET_CODE (operands[2]) == CONST_INT)
&& ((CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I'))
||(CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')))
&& (GET_CODE (operands[4]) == CONST_INT)
&& ((CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'I'))
||(CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'J'))))
"
"*
{
rtx ops[3];
int i;
i = INTVAL (operands[2]) + INTVAL (operands[4]);
if (i == 0)
{
if ((REGNO (operands[3])) == (REGNO (operands[1])))
{
if ((REGNO (operands[0])) == (REGNO (operands[3])))
return \"\\t\\t# NULL %0 <- %1 + %2; %3 <- %0 + %4\";
else
return \"\\t\\t# NULL %0 <- %1 + %2; %3 <- %0 + %4 and dead %0\";
}
else
return \"add%:\\t%3,%1,$0\\t# %0 <- %1 + %2; %3 <- %0 + %4 and dead %0\";
}
else
{
ops[0] = operands[3];
ops[1] = operands[1];
ops[2] = gen_rtx (CONST_INT, VOIDmode, i);
output_asm_insn (\"addi%:\\t%0,%1,%2\\t# simplification of:\", ops);
return \"\\t\\t\\t# %0 <- %1 + %2; %3 <- %0 + %4 and dead %0\";
}
}")
(define_peephole
[(set (match_operand:SI 0 "general_operand" "=r")
(plus:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "general_operand" "IJ")))
(set (match_operand:SI 3 "general_operand" "=r")
(minus:SI (match_dup 0)
(match_operand:SI 4 "general_operand" "IJ")))]
"(((REGNO (operands[0])) == (REGNO (operands[3])))
||
dead_or_set_p (insn, operands[0]))
&&
( /* CONSTRAINTS */
(GET_CODE (operands[2]) == CONST_INT)
&& ((CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I'))
||(CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')))
&& (GET_CODE (operands[4]) == CONST_INT)
&& ((CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'I'))
||(CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'J'))))
"
"*
{
rtx ops[3];
int i;
i = INTVAL (operands[2]) - INTVAL (operands[4]);
if (i == 0)
{
if ((REGNO (operands[3])) == (REGNO (operands[1])))
{
if ((REGNO (operands[0])) == (REGNO (operands[3])))
return \"\\t\\t# NULL %0 <- %1 + %2; %3 <- %0 - %4\";
else
return \"\\t\\t# NULL %0 <- %1 + %2; %3 <- %0 - %4 and dead %0\";
}
else
return \"add%:\\t%3,%1,$0\\t# %0 <- %1 + %2; %3 <- %0 - %4 and dead %0\";
}
else
{
ops[0] = operands[3];
ops[1] = operands[1];
ops[2] = gen_rtx (CONST_INT, VOIDmode, i);
output_asm_insn (\"addi%:\\t%0,%1,%2\\t# simplification of:\", ops);
return \"\\t\\t\\t# %0 <- %1 + %2; %3 <- %0 - %4 and dead %0\";
}
}")
(define_peephole
[(set (match_operand:SI 0 "general_operand" "=r")
(minus:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "general_operand" "IJ")))
(set (match_operand:SI 3 "general_operand" "=r")
(plus:SI (match_dup 0)
(match_operand:SI 4 "general_operand" "IJ")))]
"(((REGNO (operands[0])) == (REGNO (operands[3])))
||
dead_or_set_p (insn, operands[0]))
&&
( /* CONSTRAINTS */
(GET_CODE (operands[2]) == CONST_INT)
&& ((CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I'))
||(CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')))
&& (GET_CODE (operands[4]) == CONST_INT)
&& ((CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'I'))
||(CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'J'))))
"
"*
{
rtx ops[3];
int i;
i = (- INTVAL (operands[2])) + INTVAL (operands[4]);
if (i == 0)
{
if ((REGNO (operands[3])) == (REGNO (operands[1])))
{
if ((REGNO (operands[0])) == (REGNO (operands[3])))
return \"\\t\\t# NULL %0 <- %1 - %2; %3 <- %0 + %4\";
else
return \"\\t\\t# NULL %0 <- %1 - %2; %3 <- %0 + %4 and dead %0\";
}
else
return \"add%:\\t%3,%1,$0\\t# %0 <- %1 - %2; %3 <- %0 + %4 and dead %0\";
}
else
{
ops[0] = operands[3];
ops[1] = operands[1];
ops[2] = gen_rtx (CONST_INT, VOIDmode, i);
output_asm_insn (\"addi%:\\t%0,%1,%2\\t# simplification of:\", ops);
return \"\\t\\t\\t# %0 <- %1 - %2; %3 <- %0 + %4 and dead %0\";
}
}")
(define_peephole
[(set (match_operand:SI 0 "general_operand" "=r")
(minus:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "general_operand" "IJ")))
(set (match_operand:SI 3 "general_operand" "=r")
(minus:SI (match_dup 0)
(match_operand:SI 4 "general_operand" "IJ")))]
"((REGNO (operands[0]) == REGNO (operands[3])
|| dead_or_set_p (insn, operands[0]))
&&
(GET_CODE (operands[2]) == CONST_INT
&& (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
&& GET_CODE (operands[4]) == CONST_INT
&& (CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'I')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[4]), 'J'))))"
"*
{
rtx ops[3];
int i = - (INTVAL (operands[2]) + INTVAL (operands[4]));
if (i == 0)
{
if (REGNO (operands[3]) == REGNO (operands[1]))
{
if (REGNO (operands[0]) == REGNO (operands[3]))
return \"\\t\\t# NULL %0 <- %1 - %2; %3 <- %0 - %4\";
else
return \"\\t\\t# NULL %0 <- %1 - %2; %3 <- %0 - %4 and dead %0\";
}
else
return \"add%:\\t%3,%1,$0\\t# %0 <- %1 - %2; %3 <- %0 - %4 and dead %0\";
}
else
{
ops[0] = operands[3];
ops[1] = operands[1];
ops[2] = gen_rtx (CONST_INT, VOIDmode, i);
output_asm_insn (\"addi%:\\t%0,%1,%2\\t# simplification of:\", ops);
return \"\\t\\t\\t# %0 <- %1 - %2; %3 <- %0 - %4 and dead %0\";
}
}")
;;
;; ....................
;;
;; ARITHMETIC
;;
;; ....................
;;
(define_insn "adddf3"
[(set (match_operand:DF 0 "general_operand" "=f")
(plus:DF (match_operand:DF 1 "general_operand" "%f")
(match_operand:DF 2 "general_operand" "f")))]
""
"add.d\\t%0,%1,%2")
(define_insn "addsf3"
[(set (match_operand:SF 0 "general_operand" "=f")
(plus:SF (match_operand:SF 1 "general_operand" "%f")
(match_operand:SF 2 "general_operand" "f")))]
""
"add.s\\t%0,%1,%2")
(define_insn "addsi3"
[(set (match_operand:SI 0 "register_operand" "=r")
(plus:SI (match_operand:SI 1 "register_operand" "%r")
(match_operand:SI 2 "general_operand" "rIJ")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I'))
return \"addi%:\\t%0,%1,%x2\\t#addsi3\\t%1,%d2 -> %0\";
else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
return \"add%:\\t%0,%1,$0\\t#addsi3\\t%1,%2 -> %0\";
else abort_with_insn (insn, \"Constant does not fit descriptor\");
}
else
return \"add%:\\t%0,%1,%2\\t#addsi3\\t%1,%2 -> %0\";
}")
(define_insn "addhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(plus:HI (match_operand:HI 1 "general_operand" "%r")
(match_operand:HI 2 "general_operand" "rIJ")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I'))
return \"addi%:\\t%0,%1,%x2\\t#addhi3\\t%1,%d2 -> %0\";
else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
return \"add%:\\t%0,%1,$0\\t#addhi3\\t%1,%2 -> %0\";
else abort_with_insn (insn, \"Constant does not fit descriptor\");
}
else
return \"add%:\\t%0,%1,%2\\t#addhi3 %1,%2 -> %0\";
}")
(define_insn "addqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(plus:QI (match_operand:QI 1 "general_operand" "%r")
(match_operand:QI 2 "general_operand" "rIJ")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I'))
return \"addi%:\\t%0,%1,%x2\\t#addqi3\\t%1,%d2 -> %0\";
else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
return \"add%:\\t%0,%1,$0\\t#addqi3\\t%1,%2 -> %0\";
else abort_with_insn (insn, \"Constant does not fit descriptor\");
}
else
return \"add%:\\t%0,%1,%2\\t#addqi3 %1,%2 -> %0\";
}")
;;- All kinds of subtract instructions.
(define_insn "subdf3"
[(set (match_operand:DF 0 "general_operand" "=f")
(minus:DF (match_operand:DF 1 "general_operand" "f")
(match_operand:DF 2 "general_operand" "f")))]
""
"sub.d\\t%0,%1,%2")
(define_insn "subsf3"
[(set (match_operand:SF 0 "general_operand" "=f")
(minus:SF (match_operand:SF 1 "general_operand" "f")
(match_operand:SF 2 "general_operand" "f")))]
""
"sub.s\\t%0,%1,%2")
(define_insn "subsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(minus:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "general_operand" "rIJ")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I'))
{
rtx ops[4];
ops[0] = operands[0];
ops[1] = operands[1];
ops[3] = operands[2];
ops[2] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[2]));
output_asm_insn (\"addi%:\\t%0,%1,%x2\\t#subsi3\\t%1,%d3 -> %0\",
ops);
return \"\";
}
else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
return \"sub%:\\t%0,%1,$0\\t#subsi3\\t%1,%2 -> %0\";
else abort_with_insn (insn, \"Constant does not fit descriptor\");
}
else
return \"sub%:\\t%0,%1,%2\\t#subsi3 %1,%2 -> %0\";
}")
(define_insn "subhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(minus:HI (match_operand:HI 1 "general_operand" "r")
(match_operand:HI 2 "general_operand" "r")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I'))
{
rtx ops[4];
ops[0] = operands[0];
ops[1] = operands[1];
ops[3] = operands[2];
ops[2] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[2]));
output_asm_insn (\"addi%:\\t%0,%1,%x2\\t#subhi3\\t%1,%d3 -> %0\"
, ops);
return \"\";
}
else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
return \"sub%:\\t%0,%1,$0\\t#subhi3\\t%1,%2 -> %0\";
else abort_with_insn (insn, \"Constant does not fit descriptor\");
}
else
return \"sub%:\\t%0,%1,%2\\t#subhi3 %1,%2 -> %0\";
}")
(define_insn "subqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(minus:QI (match_operand:QI 1 "general_operand" "r")
(match_operand:QI 2 "general_operand" "r")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'I'))
{
rtx ops[4];
ops[0] = operands[0];
ops[1] = operands[1];
ops[3] = operands[2];
ops[2] = gen_rtx (CONST_INT, VOIDmode, -INTVAL (operands[2]));
output_asm_insn (\"addi%:\\t%0,%1,%x2\\t#subqi3\\t%1,%d3 -> %0\"
, ops);
return \"\";
}
else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
return \"sub%:\\t%0,%1,$0\\t#subqi3\\t%1,%2 -> %0\";
else abort_with_insn (insn, \"Constant does not fit descriptor\");
}
else
return \"sub%:\\t%0,%1,%2\\t#subqi3 %1,%2 -> %0\";
}")
;;- Multiply instructions.
(define_insn "muldf3"
[(set (match_operand:DF 0 "general_operand" "=f")
(mult:DF (match_operand:DF 1 "general_operand" "%f")
(match_operand:DF 2 "general_operand" "f")))]
""
"mul.d\\t%0,%1,%2")
(define_insn "mulsf3"
[(set (match_operand:SF 0 "general_operand" "=f")
(mult:SF (match_operand:SF 1 "general_operand" "%f")
(match_operand:SF 2 "general_operand" "f")))]
""
"mul.s\\t%0,%1,%2")
(define_insn "mulsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(mult:SI (match_operand:SI 1 "general_operand" "%r")
(match_operand:SI 2 "general_operand" "r")))]
""
"mul\\t%0,%1,%2\\t#mulsi3 %1,%2 -> %0")
(define_insn "mulhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(mult:HI (match_operand:HI 1 "general_operand" "%r")
(match_operand:HI 2 "general_operand" "r")))]
""
"mul\\t%0,%1,%2\\t#mulhi3 %1,%2 -> %0")
(define_insn "mulqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(mult:QI (match_operand:QI 1 "general_operand" "%r")
(match_operand:QI 2 "general_operand" "r")))]
""
"mul\\t%0,%1,%2\\t#mulhi3 %1,%2 -> %0")
;;- Divide instructions.
(define_insn "divdf3"
[(set (match_operand:DF 0 "general_operand" "=f")
(div:DF (match_operand:DF 1 "general_operand" "f")
(match_operand:DF 2 "general_operand" "f")))]
""
"div.d\\t%0,\\t%1,%2")
(define_insn "divsf3"
[(set (match_operand:SF 0 "general_operand" "=f")
(div:SF (match_operand:SF 1 "general_operand" "f")
(match_operand:SF 2 "general_operand" "f")))]
""
"div.s\\t%0,%1,%2")
(define_insn "divsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(div:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "general_operand" "r")))]
""
"div\\t%0,%1,%2\\t#divsi3 %1,%2 -> %0")
(define_insn "divhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(div:HI (match_operand:HI 1 "general_operand" "r")
(match_operand:HI 2 "general_operand" "r")))]
""
"div\\t%0,%1,%2\\t#divhi3 %1,%2 -> %0")
(define_insn "divqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(div:QI (match_operand:QI 1 "general_operand" "r")
(match_operand:QI 2 "general_operand" "r")))]
""
"div\\t%0,%1,%2\\t#divqi3 %1,%2 -> %0")
;;
;; ....................
;;
;; LOGICAL
;;
;; ....................
;;
(define_insn "anddi3"
[(set (match_operand:DI 0 "general_operand" "=r")
(and:DI (match_operand:DI 1 "general_operand" "%r")
(match_operand:DI 2 "general_operand" "r")))]
""
"*
{
rtx xops[3];
if ((REGNO (operands[0]) != (REGNO (operands[1]) +1))
&&
(REGNO (operands[0]) != (REGNO (operands[2]) +1)))
{
/* TAKE CARE OF OVERLAPS */
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
xops[2] = gen_rtx (REG, SImode, REGNO (operands[2]));
output_asm_insn (\"and\\t%0,%1,%2\\t#anddi %1,%2 -> %0\", xops);
xops[0] = gen_rtx (REG, SImode, REGNO (xops[0])+1);
xops[1] = gen_rtx (REG, SImode, REGNO (xops[1])+1);
xops[2] = gen_rtx (REG, SImode, REGNO (xops[2])+1);
output_asm_insn (\"and\\t%0,%1,%2\\t#anddi %1,%2 -> %0\", xops);
}
else
abort ();
return \"\";
}")
(define_insn "andsi3"
[(set (match_operand:SI 0 "general_operand" "=r,&r")
(and:SI (match_operand:SI 1 "general_operand" "%r,r")
(match_operand:SI 2 "general_operand" "rJ,K")))]
""
"*
{
rtx xops[3];
if (GET_CODE (operands[2]) == CONST_INT)
{
if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'K'))
if (INTVAL (operands[2]) >= 0)
{
return \"andi\\t%0,%1,%x2\\t#andsi3\\t%1,%d2 -> %0\";
}
else
{
xops[0] = operands[0];
xops[1] = operands[1];;
xops[2] = gen_rtx (CONST_INT, VOIDmode,
(INTVAL (operands[2]))>>16);
output_asm_insn (\"lui\\t%0,%x2\\t#load higher part (andsi3)\",
xops);
xops[2] = gen_rtx (CONST_INT, VOIDmode,
0xffff & (INTVAL (operands[2])));
output_asm_insn (\"addi%:\\t%0,$0,%x2\\t#load lower part (andsi3)\",
xops);
output_asm_insn (\"and\\t%0,%0,%1\\t#andsi3\", xops);
return \"\";
}
else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
return \"and\\t%0,%1,$0\\t#andsi3\\t%1,%2 -> %0\";
else return \"ERROR op2 not zero \\t#andsi3\\t%1,%2 -> %0\";
}
else
return \"and\\t%0,%1,%2\\t#andsi3\\t%1,%2 -> %0\";
}")
(define_insn "andhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(and:HI (match_operand:HI 1 "general_operand" "%r")
(match_operand:HI 2 "general_operand" "r")))]
""
"and\\t%0,%1,%2\\t#andhi3 %1,%2 -> %0")
(define_insn "andqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(and:QI (match_operand:QI 1 "general_operand" "%r")
(match_operand:QI 2 "general_operand" "r")))]
""
"and\\t%0,%1,%2\\t#andqi3 %1,%2 -> %0")
(define_insn "iordi3"
[(set (match_operand:DI 0 "general_operand" "=r")
(ior:DI (match_operand:DI 1 "general_operand" "%r")
(match_operand:DI 2 "general_operand" "r")))]
""
"*
{
rtx xops[3];
if ((REGNO (operands[0]) != (REGNO (operands[1]) +1))
&&
(REGNO (operands[0]) != (REGNO (operands[2]) +1)))
{
/* TAKE CARE OF OVERLAPS */
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
xops[2] = gen_rtx (REG, SImode, REGNO (operands[2]));
output_asm_insn (\"or\\t%0,%1,%2\\t#iordi3 %1,%2 -> %0\", xops);
xops[0] = gen_rtx (REG, SImode, REGNO (xops[0])+1);
xops[1] = gen_rtx (REG, SImode, REGNO (xops[1])+1);
xops[2] = gen_rtx (REG, SImode, REGNO (xops[2])+1);
output_asm_insn (\"or\\t%0,%1,%2\\t#iordi3 %1,%2 -> %0\", xops);
}
else
abort ();
return \"\";
}")
(define_insn "iorsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(ior:SI (match_operand:SI 1 "general_operand" "%r")
(match_operand:SI 2 "general_operand" "rKJ")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'K'))
{
return \"ori\\t%0,%1,%x2\\t#iorsi3\\t%1,%d2 -> %0\";
}
else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
return \"or\\t%0,%1,$0\\t#iorsi3\\t%1,%2 -> %0\";
else return \"ERROR op2 not zero \\t#iorsi3\\t%1,%2 -> %0\";
}
else
return \"or\\t%0,%1,%2\\t#iorsi3\\t%1,%2 -> %0\";
}")
(define_insn "iorhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(ior:HI (match_operand:HI 1 "general_operand" "%r")
(match_operand:HI 2 "general_operand" "r")))]
""
"or\\t%0,%1,%2\\t#iorhi3 %1,%2 -> %0")
(define_insn "iorqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(ior:QI (match_operand:QI 1 "general_operand" "%r")
(match_operand:QI 2 "general_operand" "r")))]
""
"or\\t%0,%1,%2\\t#iorqi3 %1,%2 -> %0")
(define_insn "xordi3"
[(set (match_operand:DI 0 "general_operand" "=r")
(xor:DI (match_operand:DI 1 "general_operand" "r")
(match_operand:DI 2 "general_operand" "r")))]
""
"*
{
rtx xops[3];
if ((REGNO (operands[0]) != (REGNO (operands[1]) +1))
&&
(REGNO (operands[0]) != (REGNO (operands[2]) +1)))
{
/* TAKE CARE OF OVERLAPS */
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
xops[2] = gen_rtx (REG, SImode, REGNO (operands[2]));
output_asm_insn (\"xor\\t%0,%1,%2\\t#xordi3 %1,%2 -> %0\", xops);
xops[0] = gen_rtx (REG, SImode, REGNO (xops[0])+1);
xops[1] = gen_rtx (REG, SImode, REGNO (xops[1])+1);
xops[2] = gen_rtx (REG, SImode, REGNO (xops[2])+1);
output_asm_insn (\"xor\\t%0,%1,%2\\t#xordi3 %1,%2 -> %0\", xops);
}
else
abort ();
return \"\";
}")
(define_insn "xorsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(xor:SI (match_operand:SI 1 "general_operand" "%r")
(match_operand:SI 2 "general_operand" "rKJ")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'K'))
{
return \"xori\\t%0,%1,%x2\\t#xorsi3\\t%1,%d2 -> %0\";
}
else if (CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))
return \"xor\\t%0,%1,$0\\t#xorsi3\\t%1,%2 -> %0\";
else return \"ERROR op2 not zero \\t#xorsi3\\t%1,%2 -> %0\";
}
else
return \"xor\\t%0,%1,%2\\t#xorsi3\\t%1,%2 -> %0\";
}")
(define_insn "xorhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(xor:HI (match_operand:HI 1 "general_operand" "%r")
(match_operand:HI 2 "general_operand" "r")))]
""
"xor\\t%0,%1,%2\\t#xorhi3 %1,%2 -> %0")
(define_insn "xorqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(xor:QI (match_operand:QI 1 "general_operand" "%r")
(match_operand:QI 2 "general_operand" "r")))]
""
"xor\\t%0,%1,%2\\t#xorqi3 %1,%2 -> %0")
;;
;; ....................
;;
;; TRUNCATION
;;
;; ....................
;; Extension and truncation insns.
;; Those for integer source operand
;; are ordered widest source type first.
(define_insn "truncsiqi2"
[(set (match_operand:QI 0 "general_operand" "=r")
(truncate:QI (match_operand:SI 1 "general_operand" "r")))]
""
"andi\\t%0,%1,0xff\\t#truncsiqi2\\t %1 -> %0")
(define_insn "truncsihi2"
[(set (match_operand:HI 0 "general_operand" "=r")
(truncate:HI (match_operand:SI 1 "general_operand" "r")))]
""
"*
output_asm_insn (\"sll\\t%0,%1,0x10\\t#truncsihi2\\t %1 -> %0\",
operands);
return \"sra\\t%0,%0,0x10\\t#truncsihi2\\t %1 -> %0\";
")
(define_insn "trunchiqi2"
[(set (match_operand:QI 0 "general_operand" "=r")
(truncate:QI (match_operand:HI 1 "general_operand" "r")))]
""
"andi\\t%0,%1,0xff\\t#trunchiqi2\\t %1 -> %0")
(define_insn "truncdfsf2"
[(set (match_operand:SF 0 "general_operand" "=f")
(float_truncate:SF (match_operand:DF 1 "general_operand" "f")))]
""
"cvt.s.d\\t%0,%1\\t#truncdfsf2\\t %1 -> %0")
;;
;; ....................
;;
;; ZERO EXTENSION
;;
;; ....................
;; Extension insns.
;; Those for integer source operand
;; are ordered widest source type first.
(define_insn "zero_extendhisi2"
[(set (match_operand:SI 0 "general_operand" "=r,r")
(zero_extend:SI (match_operand:HI 1 "general_operand" "r,m")))]
""
"*
{
if (which_alternative == 0)
{
output_asm_insn (\"sll\\t%0,%1,0x10\\t#zero_extendhisi2\\t %1 -> %0\",
operands);
return \"srl\\t%0,%0,0x10\\t#zero_extendhisi2\\t %1 -> %0\";
}
else
return \"lhu\\t%0,%1\\t#zero extendhisi2 %1 -> %0\";
}")
(define_insn "zero_extendqihi2"
[(set (match_operand:HI 0 "general_operand" "=r")
(zero_extend:HI (match_operand:QI 1 "general_operand" "r")))]
""
"*
output_asm_insn (\"sll\\t%0,%1,0x18\\t#zero_extendqihi2\\t %1 -> %0\",
operands);
return \"srl\\t%0,%0,0x18\\t#zero_extendqihi2\\t %1 -> %0\";
")
(define_insn "zero_extendqisi2"
[(set (match_operand:SI 0 "general_operand" "=r,r")
(zero_extend:SI (match_operand:QI 1 "general_operand" "r,m")))]
""
"*
{
if (which_alternative == 0)
{
return \"andi\\t%0,%1,0xff\\t#zero_extendqisi2\\t %1 -> %0\";
}
else
return \"lbu\\t%0,%1\\t#zero extendqisi2 %1 -> %0\";
}")
;;
;; ....................
;;
;; SIGN EXTENSION
;;
;; ....................
;; Extension insns.
;; Those for integer source operand
;; are ordered widest source type first.
(define_insn "extendhisi2"
[(set (match_operand:SI 0 "general_operand" "=r,r")
(sign_extend:SI (match_operand:HI 1 "general_operand" "r,m")))]
""
"*
{
if (which_alternative == 0)
{
output_asm_insn (\"sll\\t%0,%1,0x10\\t#sign extendhisi2\\t %1 -> %0\",
operands);
return \"sra\\t%0,%0,0x10\\t#sign extendhisi2\\t %1 -> %0\";
}
else
return \"lh\\t%0,%1\\t#sign extendhisi2 %1 -> %0\";
}")
(define_insn "extendqihi2"
[(set (match_operand:HI 0 "general_operand" "=r")
(sign_extend:HI (match_operand:QI 1 "general_operand" "r")))]
""
"*
output_asm_insn (\"sll\\t%0,%1,0x18\\t#sign extendqihi2\\t %1 -> %0\",
operands);
return \"sra\\t%0,%0,0x18\\t#sign extendqihi2\\t %1 -> %0\";
")
(define_insn "extendqisi2"
[(set (match_operand:SI 0 "general_operand" "=r,r")
(sign_extend:SI (match_operand:QI 1 "general_operand" "r,m")))]
""
"*
{
if (which_alternative == 0)
{
output_asm_insn (\"sll\\t%0,%1,0x18\\t#sign extendqisi2\\t %1 -> %0\",
operands);
return \"sra\\t%0,%0,0x18\\t#sign extendqisi2\\t %1 -> %0\";
}
else
return \"lb\\t%0,%1\\t#sign extendqisi2 %1 -> %0\";
}")
(define_insn "extendsfdf2"
[(set (match_operand:DF 0 "general_operand" "=f")
(float_extend:DF (match_operand:SF 1 "general_operand" "f")))]
""
"cvt.d.s\\t%0,%1\\t#extendsfdf2\\t %1 -> %0")
;;
;; ....................
;;
;; CONVERSIONS
;;
;; ....................
(define_insn "fix_truncdfsi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(fix:SI (fix:DF (match_operand:DF 1 "general_operand" "f"))))
(clobber (reg:DF 44))]
""
"trunc.w.d\\t$f12,%1,%0\\t#fix_truncdfsi2\\t%1 -> %0\;mfc1\\t%0,$f12\\t#fix_truncdfsi2\\t%1 -> %0")
(define_insn "fix_truncsfsi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(fix:SI (fix:SF (match_operand:SF 1 "general_operand" "f"))))
(clobber (reg:DF 44))]
""
"trunc.w.s\\t$f12,%1,%0\\t#fix_truncsfsi2\\t%1 -> %0\;mfc1\\t%0,$f12\\t#fix_truncsfsi2\\t%1 -> %0")
(define_insn "floatsidf2"
[(set (match_operand:DF 0 "general_operand" "=f")
(float:DF (match_operand:SI 1 "general_operand" "r")))]
""
"mtc1\\t%1,%0\\t#floatsidf2\\t%1 -> %0\;cvt.d.w\\t%0,%0\\t#floatsidf2\\t%1 -> %0")
(define_insn "floatsisf2"
[(set (match_operand:SF 0 "general_operand" "=f")
(float:SF (match_operand:SI 1 "general_operand" "r")))]
""
"mtc1\\t%1,%0\\t#floatsisf2\\t%1 -> %0\;cvt.s.w\\t%0,%0\\t#floatsisf2\\t%1 -> %0")
;;- Wild things used when
;;- unions make double and int
;;- overlap.
;;-
;;- This must be supported
;;- since corresponding code
;;- gets generated
(define_insn ""
[(set (subreg:DF (match_operand:DI 0 "register_operand" "=ry") 0)
(match_operand:DF 1 "register_operand" "rf"))
(clobber (match_operand 2 "register_operand" "rf"))]
""
"*
{
rtx xops[2];
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1);
#else
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1]));
#endif
output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \\t likely Union\"
, xops);
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1]));
#else
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1);
#endif
output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \"
, xops);
return (\"\");
}")
(define_insn ""
[(set (subreg:DF (match_operand:DI 0 "register_operand" "=ry") 0)
(match_operand:DF 1 "register_operand" "rf"))]
""
"*
{
rtx xops[2];
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1);
#else
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1]));
#endif
output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \\t likely Union\"
, xops);
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1]));
#else
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1);
#endif
output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \"
,xops);
return (\"\");
}")
(define_insn ""
[(set (match_operand:DF 0 "register_operand" "=rf")
(subreg:DF (match_operand:DI 1 "register_operand" "ry") 0))
(clobber (match_operand 2 "register_operand" "rf"))]
""
"*
{
rtx xops[2];
xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
#endif
output_asm_insn (\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\"
, xops);
xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
#endif
output_asm_insn (\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\"
, xops);
return (\"\");
}")
(define_insn ""
[(set (match_operand:DF 0 "register_operand" "=rf")
(subreg:DF (match_operand:DI 1 "register_operand" "ry") 0))]
""
"*
{
rtx xops[2];
xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
#endif
output_asm_insn (\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\"
, xops);
xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
#endif
output_asm_insn (\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\"
, xops);
return (\"\");
}")
;;
;; ....................
;;
;; MOVES
;;
;; and
;;
;; LOADS AND STORES
;;
;; ....................
(define_insn "movdi"
[(set (match_operand:DI 0 "general_operand" "=r,*r,*m")
(match_operand:DI 1 "general_operand" "r,*miF,*r"))]
""
"*
{
extern rtx change_address ();
extern rtx plus_constant ();
if (which_alternative == 0)
{
rtx xops[2];
if (REGNO (operands[0]) != (REGNO (operands[1]) +1))
{
/* TAKE CARE OF OVERLAPS */
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
output_asm_insn (\"add%:\\t%0,$0,%1\\t#movdi %1 -> %0\", xops);
xops[0] = gen_rtx (REG, SImode, REGNO (xops[0])+1);
xops[1] = gen_rtx (REG, SImode, REGNO (xops[1])+1);
output_asm_insn (\"add%:\\t%0,$0,%1\\t#movdi %1 -> %0\", xops);
}
else
{
/* TAKE CARE OF OVERLAPS */
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1);
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
output_asm_insn (\"add%:\\t%0,$0,%1\\t#movdi %1 -> %0\", xops);
xops[0] = gen_rtx (REG, SImode, REGNO (xops[0])-1);
xops[1] = gen_rtx (REG, SImode, REGNO (xops[1])-1);
output_asm_insn (\"add%:\\t%0,$0,%1\\t#movdi %1 -> %0\", xops);
}
return \"\";
}
else if (which_alternative == 1)
{
/* No overlap here */
rtx xops[2];
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
if (GET_CODE (operands[1]) == MEM)
{
xops[1] = gen_rtx (MEM, SImode, XEXP (operands[1], 0));
output_asm_insn (\"lw\\t%0,%1\\t#movdi %1 (mem) -> %0\", xops);
}
else if (CONSTANT_P (operands[1]))
{
#ifdef WORDS_BIG_ENDIAN
xops[1] = const0_rtx;
#else
xops[1] = operands[1];
#endif
output_load_immediate (xops);
}
else if (GET_CODE (operands[1]) == CONST_DOUBLE)
{
xops[1] = gen_rtx (CONST_INT, VOIDmode,
CONST_DOUBLE_LOW (operands[1]));
output_load_immediate (xops);
}
else
abort ();
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1);
if (offsettable_memref_p (operands[1]))
{
xops[1] = adj_offsettable_operand (gen_rtx (MEM, SImode,
XEXP (operands[1], 0)),
4);
output_asm_insn (\"lw\\t%0,%1\\t#movdi %1(mem) -> %0\", xops);
}
else if (GET_CODE (operands[1]) == MEM)
{
abort ();
output_asm_insn (\"lw\\t%0,%1\\t#movdi %1(mem) -> %0\", xops);
}
else if (CONSTANT_P (operands[1]))
{
#ifdef WORDS_BIG_ENDIAN
xops[1] = operands[1];
#else
xops[1] = const0_rtx;
#endif
output_load_immediate (xops);
}
else if (GET_CODE (operands[1]) == CONST_DOUBLE)
{
xops[1] = gen_rtx (CONST_INT, VOIDmode,
CONST_DOUBLE_HIGH (operands[1]));
output_load_immediate (xops);
}
else abort ();
return \"\";
}
else
{
/* No overlap here */
rtx xops[2];
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
if (GET_CODE (operands[0]) == MEM)
xops[0] = gen_rtx (MEM, SImode, XEXP (operands[0], 0));
else abort ();
output_asm_insn (\"sw\\t%1,%0\\t#movdi %1 -> %0(mem)\", xops);
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
if (offsettable_memref_p (operands[0]))
{
xops[0] = adj_offsettable_operand (gen_rtx (MEM, SImode,
XEXP (operands[0], 0)),
4);
output_asm_insn (\"sw\\t%1,%0\\t#movdi %1 -> %0 (mem)\", xops);
}
else if (GET_CODE (operands[0]) == MEM)
{
abort ();
output_asm_insn (\"sw\\t%1,%0\\t#movdi %1(mem) -> %0\", xops);
}
else abort ();
return \"\";
}
}")
(define_insn "movsi"
[(set (match_operand:SI 0 "general_operand" "=r,r,m,r,r,m,*r")
(match_operand:SI 1 "general_operand" "r,m,r,i,J,J,*p"))]
""
"*
{
if (which_alternative >= 4)
{
if (which_alternative == 4)
return \"add%:\\t%0,$0,$0\\t#movsi\\t%1 == 0 -> %0\";
else if (which_alternative == 5)
return \"sw\\t$0,%0\\t#movsi\\t%1 == 0 -> %0\";
else if (which_alternative == 6)
{
rtx xops[4];
register rtx addr;
xops[0] = operands[0];
addr = operands[1];
if ((GET_CODE (addr) == PLUS)
&& (GET_CODE (XEXP (addr, 0)) == REG))
{
xops[1] = XEXP (addr, 0);
xops[2] = XEXP (addr, 1);
xops[3] = addr;
output_asm_insn (\"addiu\\t%0,%1,%2\\t#movsi (*p)\\t%a3 -> %0\", xops);
return \"\";
}
else abort ();
}
}
else if ((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG))
return \"add%:\\t%0,$0,%1\\t#movsi\\t%1 -> %0 \";
else if (GET_CODE (operands[0]) == REG
&&
GET_CODE (operands[1]) == CONST_INT)
{
output_load_immediate (operands);
return \"\";
}
else if (GET_CODE (operands[0]) == REG)
{
if (GET_CODE (operands[1]) == SYMBOL_REF
|| GET_CODE (operands[1]) == LABEL_REF)
return \"la\\t%0,%a1\\t#movsi %a1 -> %0\";
else if (GET_CODE (operands[1]) == CONST)
return \"la\\t%0,%a1\\t#movsi %a1(AExp) -> %0\";
else
return \"lw\\t%0,%1\\t#movsi %1 -> %0\";
}
else
return \"sw\\t%1,%0\\t#movsi %1 -> %0\";
}")
(define_insn ""
[(set (match_operand:SI 0 "register_operand" "=*r")
(match_operand:SI 1 "address_operand" "*p"))]
"FIXED_FRAME_PTR_REL_P (operands[1])"
"*
{
rtx xops[4];
register rtx addr;
xops[0] = operands[0];
addr = operands[1];
if (GET_CODE (addr) == PLUS
&& GET_CODE (XEXP (addr, 0)) == REG)
{
xops[1] = XEXP (addr, 0);
xops[2] = XEXP (addr, 1);
xops[3] = addr;
output_asm_insn (\"addiu\\t%0,%1,%2\\t#movsi (*p)\\t%a3 -> %0\", xops);
return \"\";
}
else
abort ();
}")
(define_insn "movhi"
[(set (match_operand:HI 0 "general_operand" "=r,r,m,r,r,m")
(match_operand:HI 1 "general_operand" "r,m,r,i,J,J"))]
""
"*
{
if (which_alternative == 4)
return \"add%:\\t%0,$0,$0\\t#movhi\\t%1 == 0 -> %0\";
else if (which_alternative == 5)
return \"sh\\t$0,%0\\t#movhi\\t%1 == 0 -> %0\";
else if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG)
return \"add%:\\t%0,$0,%1\\t#move.h %1 -> %0 \";
else if (GET_CODE (operands[0]) == REG
&& GET_CODE (operands[1]) == CONST_INT)
return \"addi%:\\t%0,$0,%x1\\t# movhi %1 -> %0\";
else if (GET_CODE (operands[0]) == REG)
return \"lh\\t%0,%1\\t#movhi %1 -> %0\";
else
return \"sh\\t%1,%0\\t#movhi %1 -> %0\";
}")
(define_insn "movqi"
[(set (match_operand:QI 0 "general_operand" "=r,r,m,r,r,m")
(match_operand:QI 1 "general_operand" "r,m,r,i,J,J"))]
""
"*
{
if (which_alternative == 4)
return \"add%:\\t%0,$0,$0\\t#movqi\\t%1 == 0 -> %0\";
else if (which_alternative == 5)
return \"sb\\t$0,%0\\t#movqi\\t%1 == 0 -> %0\";
else if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG)
return \"add%:\\t%0,$0,%1\\t#move.b %1 -> %0 \";
if ((GET_CODE (operands[0]) == REG )
&&
(GET_CODE (operands[1]) == CONST_INT))
return \"addi%:\\t%0,$0,%x1\\t# movqi %1 -> %0\";
/* Should say that I am not padding high order
** bits correctly
*/
else if (GET_CODE (operands[0]) == REG)
return \"lb\\t%0,%1\\t#movqi %1 -> %0\";
else
return \"sb\\t%1,%0\\t#movqi %1 -> %0\";
}")
(define_insn "movsf"
[(set (match_operand:SF 0 "general_operand" "=f,rf,m,f,!rf")
(match_operand:SF 1 "general_operand" "f,m,rf,F,rf"))
(clobber (reg:SI 24))]
""
"*
{
if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG)
{
if (REGNO (operands[0]) >= 32)
{
if (REGNO (operands[1]) >= 32)
return \"mov.s %0,%1\\t#movsf %1 -> %0 \";
return \"mtc1 %1,%0\";
}
if (REGNO (operands[1]) >= 32)
return \"mfc1 %0,%1\";
return \"add%: %0,$0,%1\";
}
if (GET_CODE (operands[0]) == REG
&& GET_CODE (operands[1]) == CONST_DOUBLE)
{
rtx xops[3];
xops[0] = operands[0];
xops[1] = gen_rtx (CONST_INT, VOIDmode,
(XINT (operands[1], 0))>>16);
xops[2] = gen_rtx (CONST_INT, VOIDmode,
XINT (operands[1], 0));
output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops);
xops[1] = gen_rtx (CONST_INT, VOIDmode,
(XINT (operands[1], 0)) & 0xff);
output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops);
output_asm_insn (\"mtc1\\t$24,%0\", xops);
xops[0] = gen_rtx (REG, SFmode, REGNO (xops[0])+1);
xops[1] = gen_rtx (CONST_INT, VOIDmode,
(XINT (operands[1], 1))>>16);
xops[2] = gen_rtx (CONST_INT, VOIDmode,
XINT (operands[1], 1));
output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops);
xops[1] = gen_rtx (CONST_INT, VOIDmode,
(XINT (operands[1], 1)) & 0xff);
output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops);
output_asm_insn (\"mtc1\\t$24,%0\", xops);
return \"cvt.s.d\\t %0,%0 \";
}
/* Should say that I am not padding high order
** bits correctly
*/
else if (GET_CODE (operands[0]) == REG)
{
if (REGNO (operands[0]) < 32)
return \"lw\\t %0,%1\\t#movsf %1 -> %0\";
return \"l.s\\t %0,%1\\t#movsf %1 -> %0\";
}
else
{
if (REGNO (operands[1]) < 32)
return \"sw\\t %1,%0\\t#movsf %1 -> %0\";
return \"s.s\\t %1,%0\\t#movsf %1 -> %0\";
}
}")
;; ---
(define_insn "movdf"
[(set (match_operand:DF 0 "general_operand" "=f,f,m,f,*f,*y")
(match_operand:DF 1 "general_operand" "f,m,f,F,*y,*f"))
(clobber (reg:SI 24))]
""
"*
{
if (which_alternative > 3)
{
rtx xops[2];
if (REGNO (operands[1]) == 6)
{
xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
#endif
output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
, xops);
xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
#endif
output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
, xops);
return (\"\");
}
else if (REGNO (operands[0]) == 6)
{
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1);
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
#endif
output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
, xops);
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1]));
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
#endif
output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
, xops);
return (\"\");
}
else
abort_with_insn (insn,
\"Matched *y constraint and register number wrong\");
}
else
{
if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG)
return \"mov.d\\t%0,%1\\t#movdf %1 -> %0 \";
if (GET_CODE (operands[0]) == REG
&& GET_CODE (operands[1]) == CONST_DOUBLE)
{
rtx xops[3];
xops[0] = operands[0];
xops[1] = gen_rtx (CONST_INT, VOIDmode,
(XINT (operands[1], 0))>>16);
xops[2] = gen_rtx (CONST_INT, VOIDmode,
XINT (operands[1], 0));
output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops);
xops[1] = gen_rtx (CONST_INT, VOIDmode,
(XINT (operands[1], 0)) & 0xff);
output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops);
output_asm_insn (\"mtc1\\t%0,$24\", xops);
xops[0] = gen_rtx (REG, SFmode, REGNO (xops[0])+1);
xops[1] = gen_rtx (CONST_INT, VOIDmode,
(XINT (operands[1], 1))>>16);
xops[2] = gen_rtx (CONST_INT, VOIDmode,
XINT (operands[1], 1));
output_asm_insn (\"lui\\t$24,%x1\\t#move high part of %2\", xops);
xops[1] = gen_rtx (CONST_INT, VOIDmode,
(XINT (operands[1], 1)) & 0xff);
output_asm_insn (\"ori\\t$24,%x1\\t#move low part of %2\", xops);
output_asm_insn (\"mtc1\\t%0,$24\", xops);
return \"# \";
}
else if (GET_CODE (operands[0]) == REG)
return \"l.d\\t %0,%1\\t#movdf %1 -> %0\";
else
return \"s.d\\t %1,%0\\t#movdf %1 -> %0\";
}
}")
(define_insn ""
[(set (match_operand:SF 0 "general_operand" "=f,f,m")
(match_operand:SF 1 "general_operand" "f,m,f"))]
""
"*
{
if (GET_CODE (operands[0]) == REG && GET_CODE (operands[1]) == REG)
return \"mov.s %0,%1\\t#movsf %1 -> %0 \";
if (GET_CODE (operands[0]) == REG)
return \"l.s\\t %0,%1\\t#movsf %1 -> %0\";
else
return \"s.s\\t %1,%0\\t#movsf %1 -> %0\";
}")
;; ---
(define_insn ""
[(set (match_operand:DF 0 "general_operand" "=f,f,m,*f,*y")
(match_operand:DF 1 "general_operand" "f,m,f,*y,*f"))]
""
"*
{
if (which_alternative > 2)
{
rtx xops[2];
if (REGNO (operands[1]) == 6)
{
xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
#endif
output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
, xops);
xops[0] = gen_rtx (REG, DFmode, REGNO (operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
#endif
output_asm_insn (\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
, xops);
return (\"\");
}
else if (REGNO (operands[0]) == 6)
{
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1])+1);
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
#endif
output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
, xops);
xops[0] = gen_rtx (REG, SImode, REGNO (operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx (REG, DFmode, REGNO (operands[1]));
#else
xops[1] = gen_rtx (REG, SImode, REGNO (operands[1])+1);
#endif
output_asm_insn (\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
, xops);
return (\"\");
}
else
abort_with_insn (insn,
\"Matched *y constraint and register number wrong\");
}
else
{
if ((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG))
return \"mov.d\\t%0,%1\\t#movdf %1 -> %0 \";
if (GET_CODE (operands[0]) == REG)
return \"l.d\\t %0,%1\\t#movdf %1 -> %0\";
else
return \"s.d\\t %1,%0\\t#movdf %1 -> %0\";
}
}")
(define_insn ""
[(set (match_operand:SI 0 "general_operand" "=r")
(match_operand:QI 1 "general_operand" "r"))]
""
"andi\\t%0,%1,0xff\\t#Wild zero_extendqisi2\\t %1 -> %0")
;;
;; ....................
;;
;; OTHER ARITHMETIC AND SHIFT
;;
;; ....................
(define_insn "ashlqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(ashift:QI (match_operand:QI 1 "general_operand" "r")
(match_operand:SI 2 "arith32_operand" "ri")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlqi3\\t (%1<<%2) -> %0\", operands);
}
else
output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlqi3\\t (%1<<%2) -> %0 (asm syntax)\",
operands);
return \"andi\\t%0,%0,0xff\\t#ashlqi3\";
}")
(define_insn "ashlhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(ashift:HI (match_operand:HI 1 "general_operand" "r")
(match_operand:SI 2 "arith32_operand" "ri")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlhi3\\t (%1<<%2) -> %0\",
operands);
}
else
output_asm_insn (\"sll\\t%0,%1,%2\\t#ashlhi3\\t (%1<<%2) -> %0 (asm syntax)\",
operands);
return \"sll\\t%0,%0,0x10\;sra\\t%0,%0,0x10\\t#ashlhi3\";
}")
(define_insn "ashlsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(ashift:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "arith32_operand" "ri")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
return \"sll\\t%0,%1,%2\\t#ashlsi3\\t (%1<<%2) -> %0\";
}
return \"sll\\t%0,%1,%2\\t#ashlsi3\\t (%1<<%2) -> %0 (asm syntax)\";
}")
(define_insn "ashrsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(ashiftrt:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "arith32_operand" "ri")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
return \"sra\\t%0,%1,%2\\t#ashrsi3\\t (%1>>%2) -> %0\";
}
return \"sra\\t%0,%1,%2\\t#ashrsi3\\t (%1>>%2) -> %0 (asm syntax for srav)\";
}")
(define_insn "lshrsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(lshiftrt:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "arith32_operand" "rn")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{
operands[2] = gen_rtx (CONST_INT, VOIDmode, (XINT (operands[2], 0))& 0x1f);
return \"srl\\t%0,%1,%2\\t#lshrsi3\\t (%1>>%2) -> %0\";
}
return \"srl\\t%0,%1,%2\\t#lshrsi3\\t (%1>>%2) -> %0 (asm syntax)\";
}")
(define_insn "negsi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(neg:SI (match_operand:SI 1 "general_operand" "r")))]
""
"sub%:\\t%0,$0,%1\\t#negsi2")
(define_insn "negdf2"
[(set (match_operand:DF 0 "general_operand" "=f")
(neg:DF (match_operand:DF 1 "general_operand" "f")))]
""
"neg.d\\t%0,%1\\t#negdf2")
(define_insn "negsf2"
[(set (match_operand:SF 0 "general_operand" "=f")
(neg:SF (match_operand:SF 1 "general_operand" "f")))]
""
"neg.s\\t%0,%1\\t#negsf2")
(define_insn "one_cmplsi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(not:SI (match_operand:SI 1 "general_operand" "r")))]
""
"nor\\t%0,$0,%1\\t#one_cmplsi2")
(define_insn "one_cmplhi2"
[(set (match_operand:HI 0 "general_operand" "=r")
(not:HI (match_operand:HI 1 "general_operand" "r")))]
""
"nor\\t%0,$0,%1\\t#one_cmplhi2")
(define_insn "one_cmplqi2"
[(set (match_operand:QI 0 "general_operand" "=r")
(not:QI (match_operand:QI 1 "general_operand" "r")))]
""
"nor\\t%0,$0,%1\\t#one_cmplqi2")
;;
;; ....................
;;
;; BRANCHES
;;
;; ....................
;;- MERGED CMPSI + BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"beq \\t%0,%1,%l2\\t#beq MIPS primitive insn")
;;- MERGED CMPSI + INV BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"beq \\t%0,%1,%l2\\t#beq inverted primitive insn")
;;- MERGED CMPSI + BNE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"bne \\t%0,%1,%l2\\t#bne MIPS primitive insn")
;;- MERGED CMPSI + INV BNE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"bne \\t%0,%1,%l2\\t#bne inverted primitive insn")
;;- MERGED CMPSI + BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"bgt \\t%0,%1,%l2\\t#bgt MIPS composite insn")
;;- MERGED CMPSI + INV BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"bgt \\t%0,%1,%l2\\t#bgt inverted composite insn")
;;- MERGED CMPSI + BLT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"blt \\t%0,%1,%l2\\t#blt MIPS composite insn")
;;- MERGED CMPSI + INV BLT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"blt \\t%0,%1,%l2\\t#blt inverted composite insn")
;;- MERGED CMPSI + BGE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"bge \\t%0,%1,%l2\\t#bge composite insn")
;;- MERGED CMPSI + INV BGE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"bge \\t%0,%1,%l2\\t#bge inverted composite insn")
;;- MERGED CMPSI + BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"ble \\t%0,%1,%l2\\t#ble composite insn")
;;- MERGED CMPSI + INV BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"ble \\t%0,%1,%l2\\t#ble inverted composite insn")
;;- MERGED CMPSI + BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (gtu (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"bgtu \\t%0,%1,%l2\\t#bgtu MIPS composite insn")
;;- MERGED CMPSI + INV BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (leu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"bgtu \\t%0,%1,%l2\\t#bgtu inverted composite insn")
;;- MERGED CMPSI + INV BLTU
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (geu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"bltu \\t%0,%1,%l2\\t#blt inverted composite insn")
;;- MERGED CMPSI + BGEU
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (geu (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"bgeu \\t%0,%1,%l2\\t#bgeu composite insn")
;;- MERGED CMPSI + INV BGEU
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ltu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"bgeu \\t%0,%1,%l2\\t#bgeu inverted composite insn")
;;- MERGED CMPSI + BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (leu (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"bleu \\t%0,%1,%l2\\t#bleu composite insn")
;;- MERGED CMPSI + INV BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (gtu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"bleu \\t%0,%1,%l2\\t#bleu inverted composite insn")
;;- MERGED CMPSI + BLTU
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ltu (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"bltu \\t%0,%1,%l2\\t#bltu MIPS composite insn")
;;- MERGED CMPSI + INV BLTU
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (geu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"bltu \\t%0,%1,%l2\\t#bltu inverted composite insn")
;;- FLOATING POINT CASES
;;- --------------------
;;- MERGED CMPSF + BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.eq.s\\t%0,%1\\t# Merged CMPSF + BEQ \;bc1t\\t%l2\\t# Merged CMPSF + BEQ ")
;;- MERGED CMPSF + INV BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.eq.s\\t%0,%1\\t# Merged CMPSF + BEQ \;bc1t\\t%l2\\t# Merged CMPSF + BEQ ")
;;- MERGED CMPSF + BNE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.eq.s\\t%0,%1\\t# Merged CMPSF + BNE \;bc1f\\t%l2\\t# Merged CMPSF + BNE ")
;;- MERGED CMPSF + INV BNE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.eq.s\\t%0,%1\\t# Merged CMPSF + I.BNE \;bc1f\\t%l2\\t# Merged CMPSF +I.BNE ")
;;- MERGED CMPSF + BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.le.s\\t%0,%1\\t# Merged CMPSF + BGT \;bc1f\\t%l2\\t# Merged CMPSF + BGT ")
;;- MERGED CMPSF + INV BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.le.s\\t%0,%1\\t# Merged CMPSF + I.BGT \;bc1f\\t%l2\\t# Merged CMPSF +I. BGT ")
;;- MERGED CMPSF + BLT
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.lt.s\\t%0,%1\\t# Merged CMPSF + BLT \;bc1t\\t%l2\\t# Merged CMPSF + BLT ")
;;- MERGED CMPSF + INV BLT
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.lt.s\\t%0,%1\\t# Merged CMPSF + I.BLT \;bc1t\\t%l2\\t# Merged CMPSF + I.BLT ")
;;- MERGED CMPSF + BGE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.lt.s\\t%0,%1\\t# Merged CMPSF + BGE \;bc1f\\t%l2\\t# Merged CMPSF + BGE")
;;- MERGED CMPSF + INV BGE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.lt.s\\t%0,%1\\t# Merged CMPSF +INV BGE \;bc1f\\t%l2\\t# Merged CMPSF +INV BGE ")
;;- MERGED CMPSF + BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.le.s\\t%0,%1\\t# Merged CMPSF + BLE \;bc1t\\t%l2\\t# Merged CMPSF + BLE ")
;;- MERGED CMPSF + INV BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.le.s\\t%0,%1\\t# Merged CMPSF + INV BLE \;bc1t\\t%l2\\t# Merged CMPSF +I. BLE")
;;- DOUBLE FLOATING POINT CASES
;;- --------------------
;;- MERGED CMPDF + BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.eq.d\\t%0,%1\\t# Merged CMPDF + BEQ \;bc1t\\t%l2\\t# Merged CMPDF + BEQ ")
;;- MERGED CMPDF + INV BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.eq.d\\t%0,%1\\t# Merged CMPDF + I.BEQ \;bc1t\\t%l2\\t# Merged CMPDF +I. BEQ ")
;;- MERGED CMPDF + BNE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.eq.d\\t%0,%1\\t# Merged CMPDF + BNE \;bc1f\\t%l2\\t# Merged CMPDF + BNE ")
;;- MERGED CMPDF + INV BNE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.eq.d\\t%0,%1\\t# Merged CMPDF +I. BNE \;bc1f\\t%l2\\t# Merged CMPDF +I BNE")
;;- MERGED CMPDF + BGT
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.le.d\\t%0,%1\\t# Merged CMPDF + BGT \;bc1f\\t%l2\\t# Merged CMPDF + BGT ")
;;- MERGED CMPDF + INV BGT
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.le.d\\t%0,%1\\t# Merged CMPDF + I. BGT \;bc1f\\t%l2\\t# Merged CMPDF + I. BGT ")
;;- MERGED CMPDF + BLT
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.lt.d\\t%0,%1\\t# Merged CMPDF + BLT \;bc1t\\t%l2\\t# Merged CMPDF + BLT ")
;;- MERGED CMPDF + INV BLT
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.lt.d\\t%0,%1\\t# Merged CMPDF + I.BLT \;bc1t\\t%l2\\t# Merged CMPDF + I.BLT")
;;- MERGED CMPDF + BGE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.lt.d\\t%0,%1\\t# Merged CMPDF + BGE \;bc1f\\t%l2\\t# Merged CMPDF + BGE")
;;- MERGED CMPDF + INV BGE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.lt.d\\t%0,%1\\t# Merged CMPDF +I. BGE \;bc1f\\t%l2\\t# Merged CMPDF +I. BGE")
;;- MERGED CMPDF + BLE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))]
""
"c.le.d\\t%0,%1\\t# Merged CMPDF + BLE \;bc1t\\t%l2\\t# Merged CMPDF + BLE ")
;;- MERGED CMPDF + INV BLE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))))]
""
"c.le.d\\t%0,%1\\t# Merged CMPDF +I. BLE \;bc1t\\t%l2\\t# Merged CMPDF + I.BLE ")
;;
;; ....................
;;
;; COMPARISONS
;;
;; ....................
;;- Order is significant here
;;- because there are untyped
;;- comparisons generated by
;;- the optimizer
;;- (set (cc0)
;;- (compare (const_int 2)
;;- (const_int 1)))
(define_insn "cmpsi"
[(set (cc0)
(compare (match_operand:SI 0 "register_operand" "r")
(match_operand:SI 1 "register_operand" "r")))]
""
"*
compare_collect (SImode, operands[0], operands[1]);
return \" #\\tcmpsi\\t%0,%1\";
")
;; These patterns are hopelessly invalid, because
;; comparing subword values properly requires extending them.
;; (define_insn "cmphi"
;; [(set (cc0)
;; (compare (match_operand:HI 0 "general_operand" "r")
;; (match_operand:HI 1 "general_operand" "r")))]
;; ""
;; "*
;; compare_collect (HImode, operands[0], operands[1]);
;; return \" #\\tcmphi\\t%0,%1\";
;; ")
;;
;; (define_insn "cmpqi"
;; [(set (cc0)
;; (compare (match_operand:QI 0 "general_operand" "r")
;; (match_operand:QI 1 "general_operand" "r")))]
;; ""
;; "*
;; compare_collect (QImode, operands[0], operands[1]);
;; return \" #\\tcmpqi\\t%0,%1\";
;; ")
(define_insn "cmpdf"
[(set (cc0)
(compare (match_operand:DF 0 "register_operand" "f")
(match_operand:DF 1 "register_operand" "f")))]
""
"*
compare_collect (DFmode, operands[0], operands[1]);
return \" #\\tcmpdf\\t%0,%1\" ;
")
(define_insn "cmpsf"
[(set (cc0)
(compare (match_operand:SF 0 "register_operand" "f")
(match_operand:SF 1 "register_operand" "f")))]
""
"*
compare_collect (SFmode, operands[0], operands[1]);
return \" #\\tcmpsf\\t%0,%1\" ;
")
(define_insn ""
[(set (cc0)
(match_operand:QI 0 "general_operand" "r"))]
""
"*
compare_collect (QImode, operands[0], gen_rtx (REG, QImode, 0));
return \" #\\t (set (cc0)\\t%0)\";
")
(define_insn ""
[(set (cc0)
(match_operand:HI 0 "general_operand" "r"))]
""
"*
compare_collect (HImode, operands[0], gen_rtx (REG, HImode, 0));
return \" #\\t (set (cc0)\\t%0)\";
")
(define_insn ""
[(set (cc0)
(match_operand:SI 0 "general_operand" "r"))]
""
"*
compare_collect (SImode, operands[0], gen_rtx (REG, SImode, 0));
return \" #\\t (set (cc0)\\t%0)\";
")
;;
;; ....................
;;
;; BRANCHES
;;
;; ....................
(define_insn "jump"
[(set (pc)
(label_ref (match_operand 0 "" "")))]
""
"*
{
if (GET_CODE (operands[0]) == REG)
return \"j\\t%%0\\t#jump %l0 (jr not asm syntax)\";
else
return \"j\\t%l0\\t#jump %l0\";
}")
(define_insn "beq"
[(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.eq.d\\t%0,%1\\t#beq\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.eq.s\\t%0,%1\\t#beq\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
}
else
{
output_asm_insn (\"beq\\t%0,%1,%2\\t#beq\", br_ops);
}
return \"\";
}
")
(define_insn "bne"
[(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.eq.d\\t%0,%1\\t#bne\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bne\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.eq.s\\t%0,%1\\t#bne\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bne\", br_ops);
}
else
{
output_asm_insn (\"bne\\t%0,%1,%2\\t#bne\", br_ops);
}
return \"\";
}
")
(define_insn "bgt"
[(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.le.d\\t%0,%1\\t#bgt branch %0 > %1\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bgt\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.le.s\\t%0,%1\\t#bgt branch %0 > %1\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bgt\", br_ops);
}
else
{
output_asm_insn (\"bgt\\t%0,%1,%2\\t#bgt\", br_ops);
}
return \"\";
}
")
(define_insn "blt"
[(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.lt.d\\t%0,%1\\t#blt\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#blt\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.lt.s\\t%0,%1\\t#blt\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#blt\", br_ops);
}
else
{
output_asm_insn (\"blt\\t%0,%1,%2\\t#blt\", br_ops);
}
return \" #\\tblt \\t%l0\\t#blt\";
}
")
(define_insn "bgtu"
[(set (pc)
(if_then_else (gtu (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.le.d\\t%0,%1\\t#bgtu\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bgtu\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.le.s\\t%0,%1\\t#bgtu\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bgtu\", br_ops);
}
else
{
output_asm_insn (\"bgtu\\t%0,%1,%2\\t#bgtu\", br_ops);
}
return \" #\\tbgtu \\t%l0\\t#bgtu\";
}
")
(define_insn "bltu"
[(set (pc)
(if_then_else (ltu (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.lt.d\\t%0,%1\\t#bltu\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.lt.s\\t%0,%1\\t#bltu\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops);
}
else
{
output_asm_insn (\"bltu\\t%0,%1,%2\\t#bltu\", br_ops);
}
return \"\";
}
")
(define_insn "bge"
[(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.lt.d\\t%0,%1\\t#bge\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bge\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.lt.s\\t%0,%1\\t#bge\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bge\", br_ops);
}
else
{
output_asm_insn (\"bge\\t%0,%1,%2\\t#bge\", br_ops);
}
return \"\";
}
")
(define_insn "bgeu"
[(set (pc)
(if_then_else (geu (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.lt.d\\t%0,%1\\t#bgeu\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bgeu\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.lt.s\\t%0,%1\\t#bgeu\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bgeu\", br_ops);
}
else
{
output_asm_insn (\"bgeu\\t%0,%1,%2\\t#bgeu\", br_ops);
}
return \"\";
}
")
(define_insn "ble"
[(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.le.d\\t%0,%1\\t#ble\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.le.s\\t%0,%1\\t#ble\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
}
else
{
output_asm_insn (\"ble\\t%0,%1,%2\\t#ble\", br_ops);
}
return \"\";
}
")
(define_insn "bleu"
[(set (pc)
(if_then_else (leu (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.le.d\\t%0,%1\\t#ble\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.le.s\\t%0,%1\\t#ble\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
}
else
{
output_asm_insn (\"bleu\\t%0,%1,%2\\t#bleu\", br_ops);
}
return \" #\\tbleu \\t%l0\\t#bleu\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.eq.d\\t%0,%1\\t#beq\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.eq.s\\t%0,%1\\t#beq\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
}
else
{
output_asm_insn (\"beq\\t%0,%1,%2\\t#beq Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.eq.d\\t%0,%1\\t#bne\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bne\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.eq.s\\t%0,%1\\t#bne\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops);
}
else
{
output_asm_insn (\"bne\\t%0,%1,%2\\t#bne Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.le.d\\t%0,%1\\t#bgt\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.le.s\\t%0,%1\\t#bgt\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops);
}
else
{
output_asm_insn (\"bgt\\t%0,%1,%2\\t#bgt Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (leu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.le.d\\t%0,%1\\t#bgt\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.le.s\\t%0,%1\\t#bgt\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#beq\", br_ops);
}
else
{
output_asm_insn (\"bgtu\\t%0,%1,%2\\t#bgtu Inv.\", br_ops);
}
return \" #\\tbgtu \\t%l0\\t#bgtu\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.lt.d\\t%0,%1\\t#blt\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.lt.s\\t%0,%1\\t#blt\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#beq\", br_ops);
}
else
{
output_asm_insn (\"blt\\t%0,%1,%2\\t#blt Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (geu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.lt.d\\t%0,%1\\t#bltu\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.lt.s\\t%0,%1\\t#bltu\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#bltu\", br_ops);
}
else
{
output_asm_insn (\"bltu\\t%0,%1,%2\\t#bltu Inv.\", br_ops);
}
return \" #\\tbltu \\t%l0\\t#bltu\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.lt.d\\t%0,%1\\t#bge\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bge (DF) Inv.\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.lt.s\\t%0,%1\\t#bge\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bge (SF) Inv.\", br_ops);
}
else
{
output_asm_insn (\"bge\\t%0,%1,%2\\t#bge Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (ltu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.lt.d\\t%0,%1\\t#bge\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bgeu (DF) Inv.\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.lt.s\\t%0,%1\\t#bge\", br_ops);
output_asm_insn (\"bc1f\\t%2\\t#bgeu (SF )Inv.\", br_ops);
}
else
{
output_asm_insn (\"bgeu\\t%0,%1,%2\\t#bgeu Inv.\", br_ops);
}
return \" #\\tbgeu \\t%l0\\t#bgeu\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.le.d\\t%0,%1\\t#ble\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.le.s\\t%0,%1\\t#ble\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#ble\", br_ops);
}
else
{
output_asm_insn (\"ble\\t%0,%1,%2\\t#ble Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (gtu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
""
"*
{
rtx br_ops[3];
enum machine_mode mode;
compare_restore (br_ops, &mode, insn);
br_ops[2] = operands[0];
if (mode == DFmode)
{
output_asm_insn (\"c.le.d\\t%0,%1\\t#bleu\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#bleu\", br_ops);
}
else if (mode == SFmode)
{
output_asm_insn (\"c.le.s\\t%0,%1\\t#bleu\", br_ops);
output_asm_insn (\"bc1t\\t%2\\t#bleu\", br_ops);
}
else
{
output_asm_insn (\"bleu\\t%0,%1,%2\\t#bleu Inv.\", br_ops);
}
return \"\";
}
")
(define_insn "tablejump"
[(set (pc)
(match_operand:SI 0 "general_operand" "r"))
(use (label_ref (match_operand 1 "" "")))]
""
"j\\t%0\\t# tablejump, label %l1\\t (jr not asm syntax)")
;;
;; ....................
;;
;; LINKAGE
;;
;; ....................
(define_insn "call"
[(call (match_operand 0 "general_operand" "g")
(match_operand 1 "general_operand" "g"))
(clobber (reg:SI 31))]
""
"*
{
if (GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
return \"jal\\t%0\\t# call with %1 arguments\";
else
{
operands[0] = XEXP (operands[0], 0);
return \"jal\\t$31,%0\\t# call with %1 arguments (reg)\";
}
}" )
(define_expand "call_value"
[(set (match_operand 0 "" "=rf")
(call (match_operand:SI 1 "memory_operand" "m")
(match_operand 2 "" "i")))
(clobber (reg:SI 31))]
;; operand 3 is next_arg_register
""
"
{
rtx fn_rtx, nregs_rtx;
rtvec vec;
fn_rtx = operands[1];
nregs_rtx = const0_rtx;
vec = gen_rtvec (2,
gen_rtx (SET, VOIDmode, operands[0],
gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx)),
gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)));
emit_call_insn (gen_rtx (PARALLEL, VOIDmode, vec));
DONE;
}")
(define_insn ""
[(set (match_operand 0 "general_operand" "=g,f")
(call (match_operand 1 "general_operand" "g,g")
(match_operand 2 "general_operand" "g,g")))
(clobber (match_operand 3 "general_operand" "g,g"))]
""
"*
{
if (GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
return \"jal\\t%1\\t# call %1 regle 2-call (VOIDmode)\";
else
{
operands[1] = XEXP (operands[1], 0);
return \"jal\\t$31,%1\\t# call %1 regle 2-call (VOIDmode, reg)\";
}
}")
(define_insn "nop"
[(const_int 0)]
""
"nop")
(define_expand "probe"
[(set (reg:SI 29) (minus:SI (reg:SI 29) (const_int 4)))
(set (mem:SI (reg:SI 29)) (const_int 0))
(set (reg:SI 29) (plus:SI (reg:SI 29) (const_int 4)))]
""
"")
;;
;;- Local variables:
;;- mode:emacs-lisp
;;- comment-start: ";;- "
;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
;;- eval: (modify-syntax-entry ?[ "(]")
;;- eval: (modify-syntax-entry ?] ")[")
;;- eval: (modify-syntax-entry ?{ "(}")
;;- eval: (modify-syntax-entry ?} "){")
;;- End: